// pages/publicDetail/index.ts
import {taskExecuteReadTime, taskExecuteRoute, taskExecuteShare} from "../../service/api/api-promotion";
import {createShareAppMessageInfo, createShareTimelineInfo, handleCode, handleErrCode} from "../../utils/util";
import {DEFAULT_CODE} from "../../utils/enmu";

Page({

    /**
     * 页面的初始数据
     */
    data: {
        task: {},// 当前的任务内容对象
        admin: false,// 是否是admin，只是管理员就查看
        url: '',// 目标地址
        timer: 0,// 纪录阅读时间的计时器
        times: 0,// 纪录阅读时间数量
        percentage: 0,// 纪录阅读时间数量
        countdown: 0,// 倒计时
        eachTime: 0,// 倒计时
        showTimer: false,// 是否显示右侧计时器
        showShare: false,// 是否显示分享按钮
        access: {} as any,// 当前用户权限
        currentUser: {},// 当前用户信息
        dropdownShow: false,// 是否显示底部分享
        wxCodes: [],// 之前一些分享用户的前辈信息
        curColor: '#FF814A',// 当前的颜色
        // curColor: '#389E0D',// 当前的颜色
        curFont: 20,// 当前字体大小
        startCountDown: false,// 是否可以开始倒计时
        onWebViewLoadOver: false,// webview是否加载完成
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(option) {
        const eventChannel = this.getOpenerEventChannel()
        let _that = this;
        // eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'});// 向上传递信息
        // eventChannel.emit('someEvent', {data: 'test'});
        // 监听acceptDataFromOpenerPage事件，获取上一页面通过eventChannel传送到当前页面的数据
        eventChannel.on('acceptDataFromOpenerPage', function (data) {
            console.log(data.data)
            const {data: task} = data;
            _that.taskExecuteRouteFun(task);
            _that.setData({
                task,
                url: task.route || ''
            })
        })
        const {globalData: {access, currentUser}} = getApp();
        const admin = access.showPromotion && access.签到推广x列表x管理员
        this.setData({
            access,
            admin,// 管理员
            currentUser,
        })
        setTimeout(()=>{
            _that.setData({
                showShare: !admin,
            })
        }, 1000)
    },

    /**
     * 页面加载成功时
     */
    onWebViewLoad(e) {
        console.log('onWebViewLoad', e);
        // 开始计时
        this.setData({
            onWebViewLoadOver: true
        })
        this.startCountDownCheck() && this.tikTokFun()
    },

    /**
     * 判断是否可以开始计时
     * 非管理员，route接口调用成功，webview加载成功，三个条件
     */
    startCountDownCheck() {
        return !this.data.admin && this.data.startCountDown && this.data.onWebViewLoadOver
    },

    /**
     * 时间计时器
     */
    async tikTokFun(loop = false) {
        const {data: {task, timer, times}} = this;
        clearTimeout(timer);
        let _that = this;
        if (task.executeReadTime) {// 已经统计过一次读文章
            return
        }
        if (task && task.isDemandReadTime !== null && typeof task.isDemandReadTime !== "undefined") {
            this.setData({
                showTimer: true,
                eachTime: 100 / task.isDemandReadTime
            })
            if (times >= task.isDemandReadTime) {// 计时统计完了，调用接口通知一下后台
                clearTimeout(timer);
                _that.setData({
                    curColor: '#389E0D',// 完成绿色
                    curFont: 14,
                    countdown: '完成',
                })
                // 1.5s后隐藏计时器
                setTimeout(()=>{
                    _that.setData({
                        showTimer: false,
                    })
                }, 1500)
                await taskExecuteReadTime({
                    taskId: task.id,
                }).then(res => {
                    handleCode(res, '阅读任务完成');
                }).catch(e => {
                    console.warn(e);
                    handleErrCode('计时失败')
                }).finally(() => {
                    _that.setData({
                        timer: null,
                        times: 0,
                        percentage: 0,
                        countdown: 0,
                    })
                })
            } else {
                // 初次设置一下初始值
                if (!loop){
                    this.setData({
                        countdown: task.isDemandReadTime,
                        percentage: 0,
                    })
                }
                // 继续计时
                this.data.timer = setTimeout(() => {
                    let newVal = _that.data.times + 1;
                    let countdown = task.isDemandReadTime - newVal;
                    let percentage = Number(((newVal / task.isDemandReadTime) * 100).toFixed(0));
                    // console.log(newVal);
                    // console.log(countdown);
                    // console.log(percentage);
                    _that.setData({
                        times: newVal,
                        percentage,
                        countdown
                    })
                    _that.tikTokFun(true)
                }, 1000)
            }
        } else {
            console.warn('task.isDemandReadTime is null or undefined')
        }
    },

    /**
     * 页面加载失败时
     */
    onWebViewError(e) {
        console.log(e);
        handleErrCode('获取失败')
    },

    /**
     * 公众号跳转执行
     */
    async taskExecuteRouteFun(task) {
        await taskExecuteRoute({
            taskId: task.id,
        }).then(res => {
            if (res?.code === 0) {
                this.setData({
                    startCountDown: true
                })
                this.startCountDownCheck() && this.tikTokFun()
            }
        }).catch(e => {
            console.warn(e);
            handleErrCode(e)
        })
    },

    /**
     * 执行公众号分享
     */
    async taskExecuteShareFun() {
        const {data: {task}} = this;
        console.log('taskExecuteShareFun');
        await taskExecuteShare({
            taskId: task.id,
        }).then(res => {
        }).catch(e => {
            console.warn(e);
        })
    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {
        wx.showShareMenu({
            withShareTicket: true,
            menus: [
                'shareAppMessage', // 分享给朋友
                'shareTimeline',// 分享到朋友圈
            ]
        })
    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {
        clearTimeout(this.data.timer);
    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh() {

    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom() {

    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage(options) {
        console.log('分享', options)
        if (options.from === 'button') {
            console.log("来自页面内转发按钮");
            console.log(options.target);
        } else {
            console.log("来自右上角转发菜单")
        }
        this.taskExecuteShareFun();// 执行分享接口
        let {wxCodes, currentUser, url, task} = this.data;
        wxCodes.push(currentUser.id ?? DEFAULT_CODE);// 加入当前分享用户，999999代表code错误
        const info = createShareAppMessageInfo(task, currentUser, wxCodes, 'pages/publicShareDetail/index', url)
        console.log('onShareAppMessage', info);
        return {
            ...info,
            success: (res) => {
                console.log("转发成功", res);
            },
            fail: (res) => {
                console.log("转发失败", res);
            }
        }

    },
    /**
     * 用户点击右上角分享朋友圈
     */
    onShareTimeline(options) {
        console.log('分享', options)
        let {wxCodes, currentUser, url, task} = this.data;
        const info = createShareTimelineInfo(task, currentUser, wxCodes, url)
        return {
            ...info,
            success: (res) => {
                console.log("转发成功", res);
            },
            fail: (res) => {
                console.log("转发失败", res);
            }
        }

    },
})